class IBStore(with_metaclass(MetaSingleton, object)):
    '''单例类，包装ibpy ibConnection实例。

    参数也可以在使用此存储的类中指定，例如“IBData”和“IBBroker”

    参数：

      - ``host``（默认值：``127.0.0.1``）：IB TWS或IB Gateway实际运行的位置。尽管这通常是localhost，但它不应该是

      - ``port``（默认值：``7496``）：要连接的端口。演示系统使用``7497``

      - ``clientId``（默认值：``None``）：要用于连接到TWS的clientId。

        ``None``：在1到65535之间生成一个随机id
        一个“整数”：将作为要使用的值传递。

      - ``notifyall``（默认值：``False``）

        如果为“False”，则只会将“error”消息发送到“Cerebro”和“Strategy”的“notify_store”方法。

        如果为“True”，则将从TWS接收到的每条消息都会被通知

      - ``_debug``（默认值：``False``）

        将从TWS接收到的所有消息打印到标准输出

      - ``reconnect``（默认值：``3``）

        第1次连接尝试失败后尝试重新连接的次数

        将其设置为“-1”值以永远重新连接

      - ``timeout``（默认值：``3.0``）

        重新连接尝试之间的时间（以秒为单位）

      - ``timeoffset``（默认值：``True``）

        如果为True，则使用从“reqCurrentTime”（IB服务器时间）获取的时间来计算到本地时间的偏移量，并将此偏移量用于价格通知（例如，用于CASH市场的tickPrice事件）以修改本地计算的时间戳。

        时间偏移将传播到“backtrader”生态系统的其他部分，例如**重新采样**，以使用计算的偏移量对齐重新采样时间戳。

      - ``timerefresh``（默认值：``60.0``）

        时间（以秒为单位）：需要多长时间才能刷新时间偏移量

      - ``indcash``（默认值：``True``）

        将IND代码视为现金以进行价格检索
    '''


class IBBroker(with_metaclass(MetaIBBroker, BrokerBase)):
    '''Interactive Brokers的经纪人实现。

    此类将Interactive Brokers的订单/头寸映射到“backtrader”的内部API。

    注意：

      - “tradeid”实际上不受支持，因为利润和损失直接从IB中获取。因为（如预期）以FIFO方式计算，所以对于tradeid，pnl不准确。

      - 位置

        如果在操作开始时或通过其他方式给出的订单更改了资产的持仓，则在cerebro中计算的交易将不反映现实。

        为了避免这种情况，此经纪人将不得不进行自己的头寸管理，这也将允许具有多个ID的tradeid（利润和损失也将在本地计算），但可能被认为是与实时经纪人合作的目的相悖。
    '''


class IBData(with_metaclass(MetaIBData, DataBase)):
    '''Interactive Brokers数据源。

    支持以下合约规格的参数“dataname”：

          - TICKER  # 股票类型和SMART交易所
          - TICKER-STK  # 股票和SMART交易所
          - TICKER-STK-EXCHANGE  # 股票
          - TICKER-STK-EXCHANGE-CURRENCY  # 股票

          - TICKER-CFD  # CFD和SMART交易所
          - TICKER-CFD-EXCHANGE  # CFD
          - TICKER-CDF-EXCHANGE-CURRENCY  # 股票

          - TICKER-IND-EXCHANGE  # 指数
          - TICKER-IND-EXCHANGE-CURRENCY  # 指数

          - TICKER-YYYYMM-EXCHANGE  # 期货
          - TICKER-YYYYMM-EXCHANGE-CURRENCY  # 期货
          - TICKER-YYYYMM-EXCHANGE-CURRENCY-MULT  # 期货
          - TICKER-FUT-EXCHANGE-CURRENCY-YYYYMM-MULT # 期货

          - TICKER-YYYYMM-EXCHANGE-CURRENCY-STRIKE-RIGHT  # 期权
          - TICKER-YYYYMM-EXCHANGE-CURRENCY-STRIKE-RIGHT-MULT  # 期权
          - TICKER-FOP-EXCHANGE-CURRENCY-YYYYMM-STRIKE-RIGHT # 期权
          - TICKER-FOP-EXCHANGE-CURRENCY-YYYYMM-STRIKE-RIGHT-MULT # 期权

          - CUR1.CUR2-CASH-IDEALPRO  # 外汇

          - TICKER-YYYYMMDD-EXCHANGE-CURRENCY-STRIKE-RIGHT  # 期权
          - TICKER-YYYYMMDD-EXCHANGE-CURRENCY-STRIKE-RIGHT-MULT  # 期权
          - TICKER-OPT-EXCHANGE-CURRENCY-YYYYMMDD-STRIKE-RIGHT # 期权
          - TICKER-OPT-EXCHANGE-CURRENCY-YYYYMMDD-STRIKE-RIGHT-MULT # 期权

    参数：

      - ``sectype`` (默认值：``STK``)

        如果在“dataname”规范中未提供，则应用默认值作为*security type*

      - ``exchange`` (默认值：``SMART``)

        如果在“dataname”规范中未提供，则应用默认值作为*exchange*

      - ``currency`` (默认值：``''``)

        如果在“dataname”规范中未提供，则应用默认值作为*currency*

      - ``historical`` (默认值：``False``)

        如果设置为“True”，则数据源将在第一次下载数据后停止。

        标准数据源参数“fromdate”和“todate”将被用作参考。

        如果所请求的持续时间大于IB根据所选数据时间框架/压缩允许的持续时间，则数据源将进行多次请求。

      - ``what`` (默认值：``None``)

        如果为“None”，则不同资产类型的默认值将用于历史数据请求：

          - CASH资产的“BID”
          - 任何其他资产的“TRADES”

        对于现金资产的询价，使用“ASK”

        如果希望使用其他值，请查看IB API文档

      - ``rtbar`` (默认值：``False``)

        如果设置为“True”，则将使用Interactive Brokers提供的“5秒实时条形图”作为最小刻度。根据文档，它们对应于实时值（一旦由IB收集和整理）

        如果设置为“False”，则将使用基于接收到的刻度的“RTVolume”价格。对于“CASH”资产（例如EUR.JPY），将始终使用“RTVolume”，并从中获取“bid”价格（根据互联网上散布的文献，这是IB的行业事实标准）

        即使设置为“True”，如果数据被重新采样/保留为低于秒/5的时间框架/压缩级别，则不会使用实时条形图，因为IB在该级别以下不提供它们

      - ``qcheck`` (默认值：``0.5``)

        如果未收到数据，则在“qcheck”秒后唤醒，以便正确重新采样/重放数据包并将通知传递给上游

      - ``backfill_start`` (默认值：``True``)

        在开始时执行回填。将在单个请求中获取最大可能的历史数据。

      - ``backfill`` (默认值：``True``)

        在断开连接/重新连接周期后执行回填。将使用间隙持续时间下载最小可能的数据量

      - ``backfill_from`` (默认值：``None``)

        可以传递其他数据源以执行初始层的回填。一旦数据源
    '''




#### Oanda
class OandaStore(with_metaclass(MetaSingleton, object)):
    '''单例类，用于控制与Oanda的连接。

    参数：

      - ``token`` (默认值：``None``)：API访问令牌

      - ``account`` (默认值： ``None``)：账户ID

      - ``practice`` (默认值： ``False``)：使用测试环境

      - ``account_tmout`` (默认值： ``10.0``)：账户价值/现金刷新的刷新周期
    '''




class OandaBroker(with_metaclass(MetaOandaBroker, BrokerBase)):
    '''Oanda的经纪人实现。

    此类将Oanda的订单/持仓映射到``backtrader``的内部API。

    参数：

      - ``use_positions`` (默认值：``True``)：连接到经纪人提供程序时使用现有持仓来启动经纪人。

        在实例化期间设置为``False``以忽略任何现有持仓。
    '''


class OandaData(with_metaclass(MetaOandaData, DataBase)):
    '''Oanda数据源。

    参数：

      - ``qcheck`` (默认值：``0.5``)

        如果没有接收到数据，则在指定的时间内唤醒以便正确地重新采样/重放数据包并将通知传递到上游。

      - ``historical`` (默认值：``False``)

        如果设置为``True``，则数据源将在第一次下载数据后停止。

        将使用标准数据源参数``fromdate``和``todate``作为参考。

        如果请求的持续时间大于IB根据所选数据时间框架/压缩允许的持续时间，则数据源将进行多次请求。

      - ``backfill_start`` (默认值：``True``)

        在开始时执行回填。将在单个请求中获取最大可能的历史数据。

      - ``backfill`` (默认值：``True``)

        在断开连接/重新连接周期后执行回填。将使用间隙持续时间下载最小可能的数据

      - ``backfill_from`` (默认值：``None``)

        可以传递其他数据源以执行初始层的回填。一旦数据源用尽并且如果需要，将从IB进行回填。这理想上是为了从已存储的源（如磁盘上的文件）进行回填，但不限于此。

      - ``bidask`` (默认值：``True``)

        如果为``True``，则历史/回填请求将从服务器请求买入/卖出价格

        如果为``False``，则将请求*中间价*

      - ``useask`` (默认值：``False``)

        如果为``True``，则将使用*ask*价格而不是默认使用*bid*

      - ``includeFirst`` (默认值：``True``)

        通过直接将参数设置为Oanda API调用来影响历史/回填请求的第1个条。

      - ``reconnect`` (默认值：``True``)

        网络连接断开时重新连接

      - ``reconnections`` (默认值：``-1``)

        尝试重新连接的次数：``-1``表示永远

      - ``reconntimeout`` (默认值：``5.0``)

        重新连接尝试之间等待的时间（以秒为单位）

    此数据源仅支持此``timeframe``和``compression``的映射，这些映射符合OANDA API开发人员指南中的定义：

        (TimeFrame.Seconds, 5): 'S5',
        (TimeFrame.Seconds, 10): 'S10',
        (TimeFrame.Seconds, 15): 'S15',
        (TimeFrame.Seconds, 30): 'S30',
        (TimeFrame.Minutes, 1): 'M1',
        (TimeFrame.Minutes, 2): 'M3',
        (TimeFrame.Minutes, 3): 'M3',
        (TimeFrame.Minutes, 4): 'M4',
        (TimeFrame.Minutes, 5): 'M5',
        (TimeFrame.Minutes, 10): 'M10',
        (TimeFrame.Minutes, 15): 'M15',
        (TimeFrame.Minutes, 30): 'M30',
        (TimeFrame.Minutes, 60): 'H1',
        (TimeFrame.Minutes, 120): 'H2',
        (TimeFrame.Minutes, 180): 'H3',
        (TimeFrame.Minutes, 240): 'H4',
        (TimeFrame.Minutes, 360): 'H6',
        (TimeFrame.Minutes, 480): 'H8',
        (TimeFrame.Days, 1): 'D',
        (TimeFrame.Weeks, 1): 'W',
        (TimeFrame.Months, 1): 'M',

    其他任何组合都将被拒绝
    '''


####Visual Chart

class VCStore(with_metaclass(MetaSingleton, object)):
    '''包装ibpy ibConnection实例的单例类。

    参数也可以在使用此存储的类中指定，例如“VCData”和“VCBroker”

    '''

class VCBroker(with_metaclass(MetaVCBroker, BrokerBase)):
    '''VisualChart的经纪人实现。

    此类将VisualChart的订单/头寸映射到“backtrader”的内部API。

    参数：

      - ``account``（默认值：None）

        VisualChart在经纪人上同时支持几个帐户。如果
        默认值“None”在位，则将使用ComTrader中的第一个帐户
        “Accounts”集合。

        如果提供了帐户名称，则将检查“Accounts”集合并在存在时使用

      - ``commission``（默认值：None）

        如果未传递佣金方案，则将自动生成对象

        有关进一步说明，请参见下面的注释

    注释：

      - 位置

        VisualChart通过ComTrader接口报告“OpenPositions”更新，但仅当位置具有“size”时。更新到
        表示位置已移动到ZERO是通过缺少来报告的
        这种位置。这迫使通过
        查看执行事件来保持头寸的会计，就像模拟经纪人一样

      - 佣金

        VisualChart的ComTrader接口不报告佣金
        因此，自动生成的CommissionInfo对象无法使用
        不存在的佣金来正确计算它们。为了
        支持佣金，必须传递“佣金”参数
        适当的佣金方案。

        佣金方案的文档详细说明了如何做到这一点

      - 到期时间

        ComTrader接口（或是comtypes模块？）丢弃
        “datetime”对象的“time”信息，到期日期是
        总日期。

      - 到期报告

        目前没有启发式方法来确定已取消的订单何时已过期。
        因此，过期的订单被报告为已取消。
    '''

class VCData(with_metaclass(MetaVCData, DataBase)):
    '''VisualChart数据源。

    参数：

      - ``qcheck`` (默认值：``0.5``)
        默认超时时间，以便让重采样/重放器检查当前的条形图是否可以进行交付

        仅当在数据中插入了重采样/重放过滤器时，才使用该值

      - ``historical`` (默认值：``False``)
        如果未提供``todate``参数（在基类中定义），则设置为``True``将强制进行历史下载

        如果提供了``todate``，则可以实现相同的效果

      - ``milliseconds`` (默认值：``True``)
        *Visual Chart*构建的条形图具有以下外观：
        HH:MM:59.999000

        如果此参数为``True``，则会在此时间上添加一毫秒，使其看起来像：HH::MM + 1:00.000000

      - ``tradename`` (默认值：``None``)
        连续期货无法交易，但非常适合数据跟踪。如果提供此参数，则它将是当前期货的名称，这将是交易资产。例如：

        - 001ES -> ES-Mini连续提供为``dataname``

        - ESU16 -> ES-Mini 2016-09。如果在``tradename``中提供了它，它将是交易资产。

      - ``usetimezones`` (默认值：``True``)
        对于大多数市场，*Visual Chart*提供的时间偏移信息允许将datetime转换为市场时间（*backtrader*选择表示）

        一些市场是特殊的（``096``），需要特殊的内部覆盖和时区支持以显示用户期望的市场时间。

        如果将此参数设置为``True``，则将尝试导入``pytz``以使用时区（默认值）

        禁用它将删除时区使用（如果负载过大可能有所帮助）
    '''

